﻿#pragma once
#include "HashTable.h"

namespace bit {
	template <class K, class Hash = HashFunc<K>>
	class unordered_set {
		struct SetKeyOfT {
			const K& operator() (const K& key) { return key; }
		};
	public:
		typedef typename hash_bucket::HashTable<K, K, SetKeyOfT, Hash>::const_iterator iterator;
		typedef typename hash_bucket::HashTable<K, K, SetKeyOfT, Hash>::const_iterator const_iterator;
		//iterator begin() { return _ht.begin(); }
		//iterator end() { return _ht.end(); }

		//begin() const 和 end() const 是为了支持 const unordered_set 对象
		const_iterator begin() const { return _ht.begin(); }
		const_iterator end() const { return _ht.end(); }
		//unordered_set的iterator和const_iterator是同一个类型，即 HashTable::const_iterator。
		//但 HashTable::Insert返回的是一个pair<iterator, bool>，其中iterator是HashTable::iterator（非 const 版本）。
		//通过显式构造一个const_iterator，将ret.first（HashTable::iterator）的成员（_node、_pht、_hashi）传递给const_iterator的构造函数。
		pair<iterator, bool> insert(const K& key) {
			auto ret = _ht.Insert(key);
			return pair<iterator, bool>(iterator(ret.first._node, ret.first._pht, ret.first._hashi), ret.second);
		}

		iterator find(const K& key) { return _ht.Find(key); }
		bool erase(const K& key) { return _ht.Erase(key); }
	private:
		hash_bucket::HashTable<K, K, SetKeyOfT, Hash> _ht;
	};

	void test_set() {
		unordered_set<int> us;
		us.insert(5);
		us.insert(15);
		us.insert(52);
		us.insert(3);
		unordered_set<int>::iterator it = us.begin();
		while (it != us.end()) {
			cout << *it << " ";
			++it;
		}
		cout << endl;

		for (auto e : us)
			cout << e << " ";
		cout << endl;
	}
}
